Compiler le Noyau Linux

Une introduction au noyau Linux et explication sur la compilation.

Introduction

Le noyau Linux est la base de tout système Linux. C'est la partie qui réalise toute l'abstraction du matériel, assure la gestion des droits, gère les processus, etc. Le noyau Linux constitue de ce fait la partie d'un système Linux qui répond strictement à la définition de système d'exploitation.

Il existe deux cas principaux pour qu'un administrateur doive compiler lui-même le noyau, l'ajout de fonctionnalités, et l'optimisation.

Les noyaux fournis par défaut dans les distributions Linux sont des noyaux généralistes prenant en compte tout le matériel le plus courant. Il est courant que certaines fonctionnalités importantes soient manquantes car elles ne sont pas utilisées par le public cible de la distribution. Si par exemple votre fournisseur Linux ne propose pas le support de LVM2 dans le noyau, il est possible de reconfigurer celui-ci et de le recompiler pour satisfaire exactement les besoins du système.

Le second cas où une compilation du noyau est intéressante est l'optimisation du noyau pour les machines de production. Les serveurs de production sous forte charge peuvent tirer bénéfice d'un noyau optimisé.
L'optimisation comporte deux parties importantes: la réduction de l'emprunte mémoire et la performance brute du noyau. L'emprunte mémoire peut être réduite en n'incluant dans le noyau que le strict minimum nécessaire au fonctionnement du système. Les performances brutes peuvent être obtenues en désactivant les parties de développement et débuggage du noyau, en choisissant l'architecture la plus appropriée et parfois en compilant certains pilotes de périphériques dans le noyau plutôt qu'en module.
Notez que la surcharge de travail qu'implique la gestion de noyau par l'administrateur doit être justifiée, il serait aberrant d'optimiser un noyau Linux si la charge que supporte le système n'est pas importante.

Le noyau est un système complexe composé de plusieurs milliers de fichiers sources pour un total de plusieurs millions de lignes de codes. Le code source a été produit par plusieurs milliers de programmeurs à travers le monde et malgré cela, le système conserve une architecture fiable et performante, ce qui en fait une des plus belles réussites du logiciel libre. Le système fonctionne parfaitement sous 21 architectures matérielles, et constitue ainsi un modèle de portabilité pour un système aussi complexe.

Un tel système doté d'une telle complexité serait habituellement très difficile à compiler, mais pour le noyau Linux il n'en est rien. En effet, de nombreuse personnes sont amenés a lire le code source ou à configurer le noyau et conscient de ça les développeurs maintiennent une chaine de construction très simple. La configuration d'un noyau Linux et la compilation sont des phases relativement simple et généralement les problèmes lié à la création d'un noyau personnalisé sont liés au manque de documentation concernant la configuration (il n'existe d'ailleurs pratiquement aucune documentation francophone exhaustive sur le sujet).

Numérotation des noyaux

La numérotation du noyau suit des règles précise permettant de déduire certaines caractéristique à partir du numéro. Ces règles ont été complètement changé à partir du noyau 2.6.11 mais vous verrez de nombreuses documentations expliquant l'ancien modèle et de nombreuses personne croient à tort que les anciennes règles sont toujours valable.

La nomenclature actuelle

À partir du noyau 2.6.11, le numéro du noyau est représenté sous la forme A.B.C[.D] où les parties entre crochet sont facultative, par exemple Linux 2.6.19.2. La significations des différents chiffres et la suivante:

  • A: Version du noyau. Nous sommes actuellement dans la seconde version du noyau qui a commencé en 1996. La première version datait de 1994, et la version 0 a été débuté par Linus Torvald en 1991.
  • B: Révision majeure. Ce nombre indique des changements majeurs dans le noyau, la version actuelle est la 6 débuté en 2003. Autrefois la parité du nombre indiqué si le noyau était stable ou non, désormais un nombre impaire dénote aussi une version stable.
  • C: Version mineure. Ce nombre change lors de l'ajout de pilote de périphérique ou de nouvelles fonctionnalités.
  • D: Version de patch. Le dernier nombre indique les différentes révision appliqués au noyau pour corriger des erreurs mais qui n'ajoute aucune fonctionnalités.

Autrefois il existait deux branche de développement du noyau, l'une stable, l'autre instable. Désormais, tous les changements sont inclus dans la version publié et il n'existe plus de version instable. Ce changement a accéléré le développement du noyau mais ne permet plus d'appliquer tout les derniers patch de sécurité sur une version éprouvé du noyau. En effet, pour avoir un noyau avec tout les patch de sécurité, il faut prendre la dernière version publié et il est possible que celle-ci inclue de nouveau problème de sécurité dans les nouvelles fonctionnalités.

Ce problème de stabilisation du noyau est en réalité maintenant géré par les distributeurs de noyau Linux. Les noyaux des différentes distributions (Debian, Ubuntu, Fedora, etc) sont stabilisé par l'équipe en charge de la distribution à l'aide des patchs appliqués aux dernière version et de correctif spécifique.

L'ancienne nomenclature

Autrefois le noyau Linux avait une numérotation à 3 chiffre du type A.B.C. La signification de la position des numéro était la même que pour la nouvelle nomenclature mais il existait une branche stable et une branche instable du noyau.

Le type de branche était identifié à l'aide du numéro de révision majeure du noyau (le B). Un numéro impair tel que 2.5.8 indiquait qu'il s'agit de la branche instable, tandis que les numéros pairs, tel que 2.6.7 indiquait la branche stable.

Bien que cette différence de notation ne soit plus utilisé pour les versions actuelle du noyau, il est important de la connaitre car certains système fonctionnent toujours avec des noyaux antérieurs au 2.6.11. Il existe de même des systèmes fonctionnant toujours avec la branche 2.4 qui respecte donc l'ancienne nomenclature, il faut savoir que mettre à jour de tels systèmes vers une version 2.5 serait probablement une erreur.

Obtenir les sources

Il y a trois façon d'obtenir les sources d'un noyau, les télécharger sur Internet, télécharger les patchs sur Internet ou installer un package de source fournit par votre distribution Linux.

Le noyau Linux est disponible en téléchargement sur de nombreux sites. La source la plus utilisé est certainement http://www.kernel.org/ où on peut trouver les sources du noyau sur http://www.kernel.org/pub/linux/kernel/.

Les patchs du noyau sont de même disponible sur http://www.kernel.org/pub/linux/kernel/. Pour utiliser les patchs, vous devez déjà avoir une version des sources du noyau. Il vous faut ensuite la totalité des patchs entre le numéro de version que vous avez et le numéro de version que vous désirez. Par exemple, si vous voulez passer de source de version 2.6.14 à 2.6.17 il vous faut les patch 2.6.15, 2.6.16 et 2.6.17.
Concernant les patch des versions de patch (par exemple 2.6.17.5), ils s'appliquent directement sur la version de base (dans l'exemple le patch 2.6.17.5 s'applique sur un noyau 2.6.17, pas sur le 2.6.17.4), il est donc inutile de prendre le version de patch intermédiaire.

Une fois que vous avez les sources du noyau, vous pouvez les décompresser. Habituellement, les sources de programmes sont placé dans /usr/src, et le noyau de déroge pas à la règle. Soyez néanmoins attentif que /usr/src/linux est généralement utilisé pour les sources ou les fichiers header du noyau courant, il ne faut donc pas utiliser ce dossier pour vos sources au risque d'écraser les sources du noyau courant.

Si vous avez les sources compressé en bunzip2 vous pouvez faire:

cd /usr/src
tar -jxvf linux-2.6.19.2.tar.bz2 

Dans le cas de source compressé en gunzip:

cd /usr/src
tar -zxvf linux-2.6.19.2.tar.gz

Si vous avez pris le patch vous devez patcher le noyau précédent. Prenons le cas où les sources disponibles sont celles du 2.6.18 et que l'on désire passer en 2.6.19, il faut donc appliquer le patch 2.6.19.bz2. Le plus simple est de vous mettre dans le dossier de sources du noyau 2.6.18 et de chainer la décompression et le patch:

cd /usr/src/linux-2.6.18
bzip2 -dc /chemin/jusqu/au/patch/patch-2.6.19.bz2 | patch -p1

Pour appliquer un grand nombre de patch sur un noyau, il existe un utilitaire livré avec les sources pour patcher automatiquement. L'utilitaire se trouve dans scripts/patch-kernel à partir du dossier de source.

Configurer le noyau

La configuration du noyau est une tache importante et critique car c'est à cette étape que vont être déterminé les propriétés du noyau.

Configurer un noyau pour mettre à jour ou ajouter des fonctionnalités

Dans beaucoup de cas, la configuration du noyau doit permettre la mise à jour du noyau existant ou l'ajout de fonctionnalité. Dans ce cas, le plus simple est de commencer par utiliser la configuration du noyau courant et ensuite le personnaliser.

La commande make oldconfig permet d'utiliser le fichier de configuration actuel pour fixer tout les paramètres qui existent entre les deux versions du noyau, les nouvelles options du noyau sont alors demandés interactivement dans la console. Le fichier de configuration qu'utilise la cible oldconfig est le fichier .config présent dans les sources du noyau. Si vous utilisez d'autres source que celle de votre distributeur Linux, il n'y aura pas de fichier .config, dans ce cas il faut copier le fichier de configuration du noyau actuel.

L'emplacement du fichier de configuration du noyau dépend de la distribution Linux. Les systèmes Debian (y compris Ubuntu), stockent le fichier de configuration avec le noyau dans /boot. Dans ce cas, vous pouvez copier le fichier config dans le dossier des sources à compiler, par exemple:

cp /boot/config-2.6.11-2-686 /usr/src/linux-2.6.19.2/.config

Lorsque vous avez le fichier de configuration, vous pouvez lancer make oldconfig et répondre aux questions sur les nouvelles fonctionnalités. Vous pouvez ensuite utiliser un des outils de configuration suivants pour reconfigurer et ajouter les fonctionnalités nécessaires.

Configurer le noyau

La configuration du noyau peut être réalisé à l'aide de plusieurs cible du Makefile, dont notamment: make menuconfig, make xconfig, make gconfig. Notons que parmi les autres cibles de configuration il existe make randconfig qui configure le noyau au hasard, cela ne sert strictement à rien mais c'est le genre d'humour que les développeurs ont disséminé partout dans le noyau.

Voici le détail des cibles disponible pour configurer le noyau:

  • menuconfig: Permet de configurer le noyau en console à l'aide de menu, de boite de dialogue etc, réalisée à l'aide de ncurses
  • xconfig: une interface de configuration utilisable avec un serveur X et réalisé en QT
  • gconfig: une interface graphique de configuration réalité avec GTK+

La construction pas à pas

Les cibles

Une cible de make permet de sélectionner dans le Makefile une série de règle pour construire un projet. Le noyau Linux comporte des cibles particulières pour gérer les différentes constructions et dépendances.

make mrproper

La cible mrproper est la cible de nettoyage par excellence, c'est cette cible qui sera invoqué pour nettoyer la hiérarchie avant d'entamer une nouvelle compilation. Notez que make mrproper détruit aussi la configuration courante!

Références

Objectifs liés